package com.itcam.reflection_;

/**
 * Author:Cammy.Wu
 * Date:2024-05-14
 * Description:通过反射获取泛型
 */


import java.lang.reflect.Method;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

/**
 * Java采用泛型擦除的机制来引入泛型，Java中的泛型仅仅是给编译器javac使用的，
 * 确保数据的安全性和免去强制类型转换问题，但是，一旦编译完成，所有与泛型相关的类型全部擦除
 * <p>
 * 通过反射操作泛型的方法：
 * ParameterizedType:表示一种参数化类型，比如Collection<String>
 * GenericArrayType:表示一种元素类型是参数化类型或者类型变量的数据类型
 * TypeVariable:是各种类型变量的公共父接口
 * WildcardType:代表一种通配符类型表达式
 */

public class ReflectionDemo10 {

    public void test01(Map<String, User> map, List<User> list) {
        System.out.println("test01");
    }

    public Map<String, User> test02() {
        System.out.println("test02");
        return null;
    }

    public static void main(String[] args) throws NoSuchMethodException {
        Method method = ReflectionDemo10.class.getMethod("test01", Map.class, List.class);

        Type[] genericParameterTypes = method.getGenericParameterTypes();
        for (Type genericParameterType : genericParameterTypes) {
            System.out.println("genericExceptionType = " + genericParameterType);
            if (genericParameterType instanceof ParameterizedType) {
                Type[] actualTypeArguments = ((ParameterizedType) genericParameterType).getActualTypeArguments();
                for (Type actualTypeArgument : actualTypeArguments) {
                    System.out.println("test01actualTypeArgument = " + actualTypeArgument);
                }
            }
        }
        method=ReflectionDemo10.class.getMethod("test02",null);
        Type genericReturnType = method.getGenericReturnType();

        if(genericReturnType instanceof ParameterizedType){
            Type[] actualTypeArguments = ((ParameterizedType) genericReturnType).getActualTypeArguments();
            for (Type actualTypeArgument : actualTypeArguments) {
                System.out.println("test02actualTypeArgument = " + actualTypeArgument);
            }
        }
    }

}
